package univ.lille1.fr.car.manager;

import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import univ.lille1.fr.car.ejb.Auteur;

@Stateless
public class AuteurManager {
	
	private static final String PERSISTENCE_UNIT_NAME = "LibraryDB";
	private EntityManagerFactory entityManagerFactory;
	
	@PersistenceContext
	private EntityManager entityManager;
	
	private CriteriaBuilder criteriaBuilder;
	
	public AuteurManager() {
		entityManagerFactory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
		entityManager = entityManagerFactory.createEntityManager();
	}
	
	// Ajout de quelques livres dans la bdd
	public void init(){
		// auteurs
		Auteur auteur1 = new Auteur(1,"MAAS","SARAH J.");
		Auteur auteur2 = new Auteur(2,"VERNES","JULES");
		Auteur auteur3 = new Auteur(3,"TOURNIER","MICHEL");
		
		entityManager.getTransaction().begin();
		entityManager.persist(auteur1);
		entityManager.persist(auteur2);
		entityManager.persist(auteur3);
		entityManager.getTransaction().commit();
		
//		this.close();
	}

	public void add(long auteurId, String nom, String prenom) {
		Auteur auteur = new Auteur(auteurId, nom, prenom);
		entityManager.getTransaction().begin();
		entityManager.persist(auteur);
		entityManager.getTransaction().commit();
//		this.close();
	}
	
	public void addObject(Auteur auteur) {
		entityManager.getTransaction().begin();
		entityManager.persist(auteur);
		entityManager.getTransaction().commit();
//		this.close();
	}

	public void remove(long auteurId) {
		Auteur auteur = entityManager.find(Auteur.class, auteurId);
		entityManager.getTransaction().begin();
		if(auteur != null){
			entityManager.remove(auteur);
		}
		entityManager.getTransaction().commit();
//		this.close();
	}
	
	public List<Auteur> findAll() {
		criteriaBuilder = entityManagerFactory.getCriteriaBuilder();
		CriteriaQuery<Auteur> criteriaQuery = criteriaBuilder.createQuery(Auteur.class);
		Root<Auteur> auteur = criteriaQuery.from(Auteur.class);
		criteriaQuery.select(auteur);
		TypedQuery<Auteur> typedQuery = entityManager.createQuery(criteriaQuery);
		return typedQuery.getResultList();
	}
	
	@SuppressWarnings("unchecked")
	public List<Auteur> getMaxId() {
		entityManager.getTransaction().begin();
		Query q = entityManager.createNamedQuery("MaxID");
		entityManager.getTransaction().commit();
		return q.getResultList();
	}
	
	@SuppressWarnings("unchecked")
	public List<Auteur> getExistAuthor(String nom, String prenom) {
		entityManager.getTransaction().begin();
		Query q = entityManager.createNamedQuery("ExistAuthor");
		q.setParameter("nom", nom);
		q.setParameter("prenom", prenom);
		entityManager.getTransaction().commit();
		return q.getResultList();
	}

	public Auteur findAuthor(String nom, String prenom){
		criteriaBuilder = entityManagerFactory.getCriteriaBuilder();
		CriteriaQuery<Auteur> criteriaQuery = criteriaBuilder.createQuery(Auteur.class);
		Root<Auteur> auteur = criteriaQuery.from(Auteur.class);
		Predicate predicate = criteriaBuilder.and(criteriaBuilder.equal(auteur.get("nom"), nom),criteriaBuilder.equal(auteur.get("prenom"), prenom));
		criteriaQuery.select(auteur).where(predicate);
		TypedQuery<Auteur> typedQuery = entityManager.createQuery(criteriaQuery);
		return typedQuery.getSingleResult();
	}
	
	public void close(){
		entityManager.close();
		entityManagerFactory.close();
	}
	
	public EntityManager getEntityManager(){
		return this.entityManager;
	}
}
